home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / PIL / ImageWin.py < prev    next >
Text File  |  2006-12-03  |  6KB  |  216 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: ImageWin.py 2662 2006-03-21 22:41:02Z fredrik $
  4. #
  5. # a Windows DIB display interface
  6. #
  7. # History:
  8. # 1996-05-20 fl   Created
  9. # 1996-09-20 fl   Fixed subregion exposure
  10. # 1997-09-21 fl   Added draw primitive (for tzPrint)
  11. # 2003-05-21 fl   Added experimental Window/ImageWindow classes
  12. # 2003-09-05 fl   Added fromstring/tostring methods
  13. #
  14. # Copyright (c) Secret Labs AB 1997-2003.
  15. # Copyright (c) Fredrik Lundh 1996-2003.
  16. #
  17. # See the README file for information on usage and redistribution.
  18. #
  19.  
  20. import Image
  21.  
  22. ##
  23. # The <b>ImageWin</b> module contains support to create and display
  24. # images under Windows 95/98, NT, 2000 and later.
  25.  
  26. class HDC:
  27.     def __init__(self, dc):
  28.         self.dc = dc
  29.     def __int__(self):
  30.         return self.dc
  31.  
  32. class HWND:
  33.     def __init__(self, wnd):
  34.         self.wnd = wnd
  35.     def __int__(self):
  36.         return self.wnd
  37.  
  38. ##
  39. # Create a Windows bitmap with the given mode and size.  The mode can
  40. # be one of "1", "L", "P", or "RGB".
  41. #
  42. # If the display requires a palette, this constructor creates a
  43. # suitable palette and associates it with the image. For an "L" image,
  44. # 128 greylevels are allocated. For an "RGB" image, a 6x6x6 colour
  45. # cube is used, together with 20 greylevels.
  46. #
  47. # To make sure that palettes work properly under Windows, you must
  48. # call the <b>palette</b> method upon certain events from Windows.
  49.  
  50. class Dib:
  51.  
  52.     ##
  53.     # Create Windows bitmap.
  54.     #
  55.     # @param image Either a PIL image, or a mode string.  If a
  56.     #    mode string is used, a size must also be given.  The
  57.     #    mode can be one of "1", "L", "P", or "RGB".
  58.     # @param size If the first argument is a mode string, this
  59.     #    defines the size of the image.
  60.  
  61.     def __init__(self, image, size=None):
  62.         if hasattr(image, "mode") and hasattr(image, "size"):
  63.             mode = image.mode
  64.             size = image.size
  65.         else:
  66.             mode = image
  67.             image = None
  68.         if mode not in ["1", "L", "P", "RGB"]:
  69.             mode = Image.getmodebase(mode)
  70.         self.image = Image.core.display(mode, size)
  71.         self.mode = mode
  72.         self.size = size
  73.         if image:
  74.             self.paste(image)
  75.  
  76.     ##
  77.     # Copy the bitmap contents to a device context.
  78.     #
  79.     # @param handle Device context (HDC), cast to a Python integer,
  80.     #    or a HDC or HWND instance.  In PythonWin, you can use the
  81.     #    <b>GetHandleAttrib</b> method of the <b>CDC</b> class to get
  82.     #    a suitable handle.
  83.  
  84.     def expose(self, handle):
  85.         if isinstance(handle, HWND):
  86.             dc = self.image.getdc(handle)
  87.             try:
  88.                 result = self.image.expose(dc)
  89.             finally:
  90.                 self.image.releasedc(handle, dc)
  91.         else:
  92.             result = self.image.expose(handle)
  93.         return result
  94.  
  95.     def draw(self, handle, dst, src=None):
  96.         if not src:
  97.             src = (0,0) + self.size
  98.         if isinstance(handle, HWND):
  99.             dc = self.image.getdc(handle)
  100.             try:
  101.                 result = self.image.draw(dc, dst, src)
  102.             finally:
  103.                 self.image.releasedc(handle, dc)
  104.         else:
  105.             result = self.image.draw(handle, dst, src)
  106.         return result
  107.  
  108.     ##
  109.     # Installs the palette associated with the image in the
  110.     # given device context.
  111.     # <p>
  112.     # This method should be called upon <b>QUERYNEWPALETTE</b>
  113.     # and <b>PALETTECHANGED</b> events from Windows. If this
  114.     # method returns a non-zero value, one or more display
  115.     # palette entries were changed, and the image should be
  116.     # redrawn.
  117.     #
  118.     # @param handle Device context (HDC), cast to a Python integer,
  119.     #     or an HDC or HWND instance.
  120.     # @return A true value if one or more entries were changed
  121.     #    (this indicates that the image should be redrawn).
  122.  
  123.     def query_palette(self, handle):
  124.         if isinstance(handle, HWND):
  125.             handle = self.image.getdc(handle)
  126.             try:
  127.                 result = self.image.query_palette(handle)
  128.             finally:
  129.                 self.image.releasedc(handle, handle)
  130.         else:
  131.             result = self.image.query_palette(handle)
  132.         return result
  133.  
  134.     ##
  135.     # Paste a PIL image into the bitmap image.
  136.     #
  137.     # @param im A PIL image.  The size must match the target region.
  138.     #    If the mode does not match, the image is converted to the
  139.     #    mode of the bitmap image.
  140.     # @param box A 4-tuple defining the left, upper, right, and
  141.     #    lower pixel coordinate.  If None is given instead of a
  142.     #    tuple, all of the image is assumed.
  143.  
  144.     def paste(self, im, box=None):
  145.         im.load()
  146.         if self.mode != im.mode:
  147.             im = im.convert(self.mode)
  148.         if box:
  149.             self.image.paste(im.im, box)
  150.         else:
  151.             self.image.paste(im.im)
  152.  
  153.     ##
  154.     # Load display memory contents from string buffer.
  155.     #
  156.     # @param buffer A string buffer containing display data (usually
  157.     #     data returned from <b>tostring</b>)
  158.  
  159.     def fromstring(self, buffer):
  160.         return self.image.fromstring(buffer)
  161.  
  162.     ##
  163.     # Copy display memory contents to string buffer.
  164.     #
  165.     # @return A string buffer containing display data.
  166.  
  167.     def tostring(self):
  168.         return self.image.tostring()
  169.  
  170.  
  171. ##
  172. # Create a Window with the given title size.
  173.  
  174. class Window:
  175.  
  176.     def __init__(self, title="PIL", width=None, height=None):
  177.         self.hwnd = Image.core.createwindow(
  178.             title, self.__dispatcher, width or 0, height or 0
  179.             )
  180.  
  181.     def __dispatcher(self, action, *args):
  182.         return apply(getattr(self, "ui_handle_" + action), args)
  183.  
  184.     def ui_handle_clear(self, dc, x0, y0, x1, y1):
  185.         pass
  186.  
  187.     def ui_handle_damage(self, x0, y0, x1, y1):
  188.         pass
  189.  
  190.     def ui_handle_destroy(self):
  191.         pass
  192.  
  193.     def ui_handle_repair(self, dc, x0, y0, x1, y1):
  194.         pass
  195.  
  196.     def ui_handle_resize(self, width, height):
  197.         pass
  198.  
  199.     def mainloop(self):
  200.         Image.core.eventloop()
  201.  
  202. ##
  203. # Create an image window which displays the given image.
  204.  
  205. class ImageWindow(Window):
  206.  
  207.     def __init__(self, image, title="PIL"):
  208.         if not isinstance(image, Dib):
  209.             image = Dib(image)
  210.         self.image = image
  211.         width, height = image.size
  212.         Window.__init__(self, title, width=width, height=height)
  213.  
  214.     def ui_handle_repair(self, dc, x0, y0, x1, y1):
  215.         self.image.draw(dc, (x0, y0, x1, y1))
  216.